package com.knowledgegraph.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.knowledgegraph.entity.Entity;

import java.util.List;
import java.util.Map;

/**
 * 实体服务接口
 * 
 * @author system
 * @since 2024-01-01
 */
public interface EntityService extends IService<Entity> {

    /**
     * 创建实体
     * 
     * @param entity 实体信息
     * @param creatorId 创建者ID
     * @return 创建结果
     */
    boolean createEntity(Entity entity, Long creatorId);

    /**
     * 更新实体
     * 
     * @param entity 实体信息
     * @param userId 用户ID
     * @return 更新结果
     */
    boolean updateEntity(Entity entity, Long userId);

    /**
     * 删除实体
     * 
     * @param entityId 实体ID
     * @param userId 用户ID
     * @return 删除结果
     */
    boolean deleteEntity(Long entityId, Long userId);

    /**
     * 批量删除实体
     * 
     * @param entityIds 实体ID列表
     * @param userId 用户ID
     * @return 删除结果
     */
    boolean batchDeleteEntities(List<Long> entityIds, Long userId);

    /**
     * 根据图谱ID获取实体列表
     * 
     * @param graphId 图谱ID
     * @return 实体列表
     */
    List<Entity> getEntitiesByGraphId(Long graphId);

    /**
     * 分页查询图谱实体
     * 
     * @param graphId 图谱ID
     * @param page 分页参数
     * @return 实体分页列表
     */
    IPage<Entity> getEntitiesByGraphId(Long graphId, Page<Entity> page);

    /**
     * 根据类型查询实体
     * 
     * @param graphId 图谱ID
     * @param type 实体类型
     * @return 实体列表
     */
    List<Entity> getEntitiesByType(Long graphId, String type);

    /**
     * 搜索实体
     * 
     * @param graphId 图谱ID
     * @param keyword 关键词
     * @return 实体列表
     */
    List<Entity> searchEntities(Long graphId, String keyword);

    /**
     * 获取实体统计信息
     * 
     * @param graphId 图谱ID
     * @return 统计信息
     */
    Map<String, Object> getEntityStatistics(Long graphId);

    /**
     * 获取实体类型统计
     * 
     * @param graphId 图谱ID
     * @return 类型统计
     */
    List<Map<String, Object>> getEntityTypeStatistics(Long graphId);

    /**
     * 检查实体名称是否存在
     * 
     * @param graphId 图谱ID
     * @param name 实体名称
     * @param excludeId 排除的实体ID
     * @return 是否存在
     */
    boolean existsByName(Long graphId, String name, Long excludeId);

    /**
     * 复制实体
     * 
     * @param entityId 源实体ID
     * @param targetGraphId 目标图谱ID
     * @param userId 用户ID
     * @return 新实体
     */
    Entity copyEntity(Long entityId, Long targetGraphId, Long userId);

    /**
     * 批量导入实体
     * 
     * @param entities 实体列表
     * @param graphId 图谱ID
     * @param userId 用户ID
     * @return 导入结果
     */
    Map<String, Object> batchImportEntities(List<Entity> entities, Long graphId, Long userId);

    /**
     * 分页查询实体（支持搜索和类型筛选）
     * 
     * @param page 分页参数
     * @param queryParams 查询参数
     * @return 分页结果
     */
    IPage<Entity> getEntitiesWithPagination(Page<Entity> page, Map<String, Object> queryParams);

    /**
     * 获取全局统计数据
     * 
     * @return 统计数据
     */
    Map<String, Object> getGlobalStatistics();

    /**
     * 从文件导入实体
     * 
     * @param file 上传文件
     * @param userId 用户ID
     * @return 导入结果
     */
    Map<String, Object> importEntitiesFromFile(org.springframework.web.multipart.MultipartFile file, Long userId) throws java.io.IOException;

    /**
     * 导出实体到Excel
     * 
     * @param exportParams 导出参数
     * @param response HTTP响应
     */
    void exportEntitiesToExcel(Map<String, Object> exportParams, javax.servlet.http.HttpServletResponse response) throws java.io.IOException;
}
